/**********************************************************************************************************************
 * \file LinkLayerComm.h
 * \brief 以太网链路层中断通信接口
 * \description 基于GETH模块实现的以太网链路层中断通信功能
 *********************************************************************************************************************/

#ifndef LINKLAYERCOMM_H
#define LINKLAYERCOMM_H

#include "Ifx_Types.h"
#include "IfxGeth_Eth.h"

/* 缓冲区大小定义 */
#define LINKLAYER_MAX_FRAME_SIZE    1522u  /* 最大以太网帧大小(包含MAC头、有效数据和CRC) */
#define LINKLAYER_TX_BUFFER_COUNT   4u     /* 发送缓冲区数量 */
#define LINKLAYER_RX_BUFFER_COUNT   4u     /* 接收缓冲区数量 */

/* 接收回调函数类型 */
typedef void (*LinkLayerRxCallback)(uint8* data, uint32 length);

/* 发送状态枚举 */
typedef enum {
    LINKLAYER_TX_STATUS_OK = 0,
    LINKLAYER_TX_STATUS_BUSY,
    LINKLAYER_TX_STATUS_ERROR
} LinkLayerTxStatus;

/* 链路层通信状态结构体 */
typedef struct {
    boolean initialized;           /* 初始化标志 */
    IfxGeth_Eth *gethDriver;       /* GETH驱动句柄 */
    uint8 txBuffers[LINKLAYER_TX_BUFFER_COUNT][LINKLAYER_MAX_FRAME_SIZE]; /* 发送缓冲区 */
    uint8 rxBuffers[LINKLAYER_RX_BUFFER_COUNT][LINKLAYER_MAX_FRAME_SIZE]; /* 接收缓冲区 */
    volatile uint32 txInIndex;     /* 发送缓冲区输入索引 */
    volatile uint32 txOutIndex;    /* 发送缓冲区输出索引 */
    volatile uint32 rxCount;       /* 接收数据包计数 */
    LinkLayerRxCallback rxCallback; /* 接收回调函数 */
} LinkLayerComm;

/* 全局函数声明 */

/**
 * \brief 初始化链路层通信模块
 * \param gethDriver GETH驱动句柄
 * \return TRUE: 初始化成功, FALSE: 初始化失败
 */
boolean LinkLayerComm_init(IfxGeth_Eth *gethDriver);

/**
 * \brief 发送以太网帧
 * \param data 要发送的数据指针
 * \param length 数据长度(不包含CRC)
 * \param destMac 目标MAC地址
 * \param type 以太网类型
 * \return 发送状态
 */
LinkLayerTxStatus LinkLayerComm_sendFrame(uint8* data, uint32 length, uint8* destMac, uint16 type);

/**
 * \brief 注册接收回调函数
 * \param callback 回调函数指针
 */
void LinkLayerComm_registerRxCallback(LinkLayerRxCallback callback);

/**
 * \brief 处理发送缓冲区中的数据
 */
void LinkLayerComm_processTxBuffer(void);

/**
 * \brief 处理接收到的以太网帧
 */
void LinkLayerComm_processRxFrame(void);

/**
 * \brief 获取链路层通信状态
 * \return 链路层通信状态指针
 */
LinkLayerComm* LinkLayerComm_getState(void);

#endif /* LINKLAYERCOMM_H */